package controller

import (
	"fmt"
	"i18n-template/table"
	"i18n-template/utils"

	"github.com/gin-gonic/gin"
)

func GenerateUserController() gin.HandlerFunc {
	return func(context *gin.Context) {
		user := &table.Users{}
		err := context.ShouldBind(&user)
		fmt.Println("=> 绑定数据 -> ", user)
		if err != nil {
			utils.FailResponse(context, "数据绑定失败", nil)
			return
		}
		u, err := user.FindUserByUsername(user.Username)
		if err == nil {
			utils.SuccessResponse(context, "该用户已存在", u)
			return
		}
		user.Password = utils.HandlerPwdHash256Encrypt(user.Password)
		fmt.Println("=> user ---> ", user)
		err = user.GenerateUser(user)
		if err != nil {
			fmt.Println("=> 生成用户失败 ", err.Error())
			panic(err)
		}
		utils.SuccessResponse(context, "创建用户成功", user)
	}
}

func FindUserController() gin.HandlerFunc {
	return func(context *gin.Context) {
		username := context.Query("username")
		users := table.Users{}
		if username != "" {
			u, err := users.FindAllUserByUsername(username)
			if err != nil {
				fmt.Println("err ", err.Error())
				return
			}
			utils.SuccessResponse(context, "查询用户成功!", u)
			return
		}
		u := users.FindAllUsers()
		utils.SuccessResponse(context, "查询所有用户成功!", u)
	}
}

func PatchUserController() gin.HandlerFunc {
	return func(context *gin.Context) {
		users := &table.Users{}
		err := context.ShouldBind(users)
		if err != nil {
			utils.FailResponse(context, "绑定数据失败", err.Error())
			return
		}
		_, err = users.FindUserByID(users.ID)
		if err != nil {
			utils.FailResponse(context, "用户不存在！", err.Error())
			return
		}
		err = users.PatchUserByID(users)
		if err != nil {
			utils.FailResponse(context, "用户更新失败！", err.Error())
			return
		}
		u_, _ := context.Get("user")
		var flag = false
		if users.ID == u_.(*table.Users).ID {
			flag = true
		}
		utils.SuccessResponse(context, "用户更新成功！", flag)
	}
}

func DeleteUserController() gin.HandlerFunc {
	return func(context *gin.Context) {
		user := &table.Users{}
		err := context.ShouldBind(user)
		if err != nil {
			utils.FailResponse(context, "数据绑定失败!", err.Error())
			return
		}
		_, err = user.FindUserByID(user.ID)
		if err != nil {
			utils.FailResponse(context, "该用户不存在", nil)
			return
		}
		err = user.DeleteUserByID(user)
		if err != nil {
			utils.FailResponse(context, "删除用户失败!", err.Error())
			return
		}
		utils.SuccessResponse(context, "删除成功!", nil)
	}
}

func PostLoginUserController() gin.HandlerFunc {
	return func(context *gin.Context) {
		user := &table.Users{}
		err := context.ShouldBind(&user)
		if err != nil {
			utils.FailResponse(context, "数据绑定失败!", err.Error())
			return
		}
		// 1. 查询用户是否存在
		u, err := user.FindUserByUsername(user.Username)
		if err != nil {
			utils.FailResponse(context, "该用户不存在!", nil)
			return
		}
		// 2. 新密码生成加密和查询出来的密码进行比对
		newPad := utils.HandlerPwdHash256Encrypt(user.Password)
		if newPad != u.Password {
			utils.FailResponse(context, "密码错误, 请重新登录!", nil)
			return
		}
		encryptJwt, err := utils.GenerateEncryptJwt(u.Username, u.ID)
		if err != nil {
			utils.FailResponse(context, "生成Token失败!", err.Error())
			return
		}
		//components.Redis.Set(
		//	components.Context,
		//	components.ReturnRedisPrefix(u.Username),
		//	encryptJwt, 0)
		utils.SuccessResponse(context, "登录成功!", gin.H{
			"username": u.Username,
			"id":       u.ID,
			"token":    encryptJwt,
		})
	}
}
